﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Modelo;

namespace AccesoDatos
{
    public static class BDReceta
    {
        public static string cadena = "Data Source=.\\sqlexpress; Initial Catalog=BitFood; Integrated Security=true";
        public static List<Receta> GetRecetas()
        {
            SqlConnection SQL_conn = null;
            SqlCommand comando = null;
            SqlDataReader reader = null;
            List<Receta> recetas = new List<Receta>();
            Receta receta = null;
            try
            {
                SQL_conn = new SqlConnection(cadena);
                comando = SQL_conn.CreateCommand();
                comando.CommandText = "SELECT * FROM Receta";


                SQL_conn.Open();
                reader = comando.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        receta = new Receta();
                        receta.Comensales = float.Parse(reader["Comensales"].ToString());
                        receta.Dificultad = Convert.ToInt32(reader["Dificultad"].ToString());
                        receta.Nombre = reader["Nombre"].ToString();
                        receta.Procedimiento = reader["Procedimiento"].ToString();
                        receta.Tiempo = float.Parse(reader["Tiempo"].ToString());
                        receta.Usadas = Convert.ToInt32(reader["Usadas"].ToString());
                        receta.Ingredientes = BDIngrediente.GetIngredientes(receta.Nombre);
                        recetas.Add(receta);
                    }
                    return recetas;
                }
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                if (SQL_conn != null)
                {
                    SQL_conn.Dispose();
                    if (reader != null)
                        reader.Dispose();
                }
            }
        }
        public static void SetCantidadUsadas(string nombre,int valor)
        { 
        SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "UPDATE Receta Set Usadas=Usadas+@valor Where Nombre=@nombre";
                comando.Parameters.AddWithValue("valor",valor);
                comando.Parameters.AddWithValue("nombre",nombre);
                conexion.Open();
                comando.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
        
        }
        public static List<Receta> ObtenerRecetas()
        {
            List<Receta> list = new List<Receta>();
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "select * from Receta Order by usadas desc";
                conexion.Open();
                SqlDataReader reader = comando.ExecuteReader();
                if (!reader.HasRows)
                    return null;
                else
                {
                    
                    while (reader.Read())
                    {
                        Receta receta = new Receta();
                        receta.Nombre = reader["Nombre"].ToString();
                        receta.Procedimiento = reader["Procedimiento"].ToString();
                        receta.Tiempo = float.Parse(reader["Tiempo"].ToString());
                        receta.Usadas = Convert.ToInt32(reader["Usadas"].ToString());
                        receta.Comensales = float.Parse(reader["Comensales"].ToString());
                        receta.Dificultad = Convert.ToInt32(reader["Dificultad"].ToString());
                        List<Ingrediente> ingredientes = new List<Ingrediente>();
                        ingredientes = BDIngrediente.ObtenerIngredientes(receta.Nombre);
                        receta.Ingredientes = ingredientes;
                        list.Add(receta);
                    }
                    return list;
                }
            }
            catch (SqlException)
            {
                return null;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            } 

        }
        public static bool RegistrarReceta(float comensales, int dificultad, string procedimiento, string nombre, float tiempo, List<Ingrediente> ingredientes)
        {
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "Insert into Receta(Comensales, Dificultad, Procedimiento, Nombre, Tiempo, Usadas) values(@comensales, @dificultad, @procedimiento, @nombre, @tiempo, @usadas)";
                comando.Parameters.AddWithValue("@comensales", comensales);
                comando.Parameters.AddWithValue("@dificultad", dificultad);
                comando.Parameters.AddWithValue("@procedimiento", procedimiento);
                comando.Parameters.AddWithValue("@nombre", nombre);
                comando.Parameters.AddWithValue("@tiempo", tiempo);
                comando.Parameters.AddWithValue("@usadas",0);
                conexion.Open();
                foreach (Ingrediente ingrediente in ingredientes)
                {
                    BDIngrediente.RegistrarIngrediente(ingrediente.Cantidad, ingrediente.producto, nombre);
                }
                int i = comando.ExecuteNonQuery();
                if (i <= 0)
                    return false;
                return true;

            }
            catch (SqlException)
            {
                return false;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
        }

        public static bool EliminarReceta(string nombre)
        {
            List<Ingrediente> ingredientes = new List<Ingrediente>();
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "Delete from Receta where Nombre=@nombre";

                comando.Parameters.AddWithValue("@nombre", nombre);

                conexion.Open();
                ingredientes = BDIngrediente.ObtenerIngredientes(nombre);
                foreach (Ingrediente ingrediente in ingredientes)
                {
                    BDIngrediente.EliminarIngrediente(ingrediente.producto, nombre);
                }
                int i = comando.ExecuteNonQuery();
                if (i <= 0)
                    return false;
                return true;

            }
            catch (SqlException)
            {
                return false;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
        }

        public static Receta ObtenerReceta(string nombre)
        {
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText="select * from Receta where Nombre=@nombre";
                comando.Parameters.AddWithValue("@nombre", nombre);
                conexion.Open();
                SqlDataReader reader = comando.ExecuteReader();
                if (!reader.HasRows)
                    return null;
                else
                {
                    Receta receta = new Receta();
                    while (reader.Read())
                    {
                        
                        receta.Nombre = nombre;
                        receta.Procedimiento = reader["Procedimiento"].ToString();
                        receta.Tiempo = float.Parse(reader["Tiempo"].ToString());
                        receta.Usadas = Convert.ToInt32(reader["Usadas"].ToString());
                        receta.Comensales = float.Parse(reader["Comensales"].ToString());
                        receta.Dificultad = Convert.ToInt32(reader["Dificultad"].ToString());
                        List<Ingrediente> ingredientes = new List<Ingrediente>();
                        ingredientes = BDIngrediente.ObtenerIngredientes(nombre);
                        receta.Ingredientes = ingredientes;
                        
                    }
                    return receta;
                }
            }
            catch (SqlException)
            {
                return null ;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            } 
        }

        public static List<Receta> Recetas()
        {
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "select * from Receta";
                conexion.Open();
                SqlDataReader reader = comando.ExecuteReader();
                if (!reader.HasRows)
                    return null;
                else
                {
                    List<Receta> recetas = new List<Receta>();
                    while (reader.Read())
                    {
                        Receta receta = new Receta();
                        receta.Nombre = reader["Nombre"].ToString();
                        receta.Procedimiento = reader["Procedimiento"].ToString();
                        receta.Tiempo = float.Parse(reader["Tiempo"].ToString());
                        receta.Usadas = Convert.ToInt32(reader["Usadas"].ToString());
                        receta.Comensales = float.Parse(reader["Comensales"].ToString());
                        receta.Dificultad = Convert.ToInt32(reader["Dificultad"].ToString());
                        List<Ingrediente> ingredientes = new List<Ingrediente>();
                        ingredientes = BDIngrediente.ObtenerIngredientes(receta.Nombre);
                        recetas.Add(receta);
                    }
                    return recetas;
                }
            }
            catch (SqlException)
            {
                return null;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
        }

        public static bool ModificarReceta(float comensales, int dificultad, string procedimiento, string nombre, float tiempo, List<Ingrediente> ingredientes)
        {
            SqlConnection conexion = null;
            SqlCommand comando = null;
            try
            {
                conexion = new SqlConnection(cadena);
                comando = conexion.CreateCommand();
                comando.CommandText = "Update Receta set Comensales=@comensales, Dificultad=@dificultad, Procedimiento=@procedimiento, Tiempo=@tiempo where Nombre=@nombre";
                comando.Parameters.AddWithValue("@comensales", comensales);
                comando.Parameters.AddWithValue("@dificultad", dificultad);
                comando.Parameters.AddWithValue("@procedimiento", procedimiento);
                comando.Parameters.AddWithValue("@nombre", nombre);
                comando.Parameters.AddWithValue("@tiempo", tiempo);
                
                foreach(Ingrediente ingrediente in ingredientes)
                {
                    if (ingrediente.estado == 1)//eliminado
                        BDIngrediente.EliminarIngrediente(ingrediente.producto, nombre);
                    else
                    {
                        if(ingrediente.estado==2)
                            BDIngrediente.RegistrarIngrediente(ingrediente.Cantidad, ingrediente.producto, nombre);
                    }
                }
                conexion.Open();
                int i = comando.ExecuteNonQuery();
                if (i <= 0)
                    return false;
                return true;

            }
            catch (SqlException)
            {
                return false;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
        }
    }
}
